# Provides itk_module_kwstyle_test macro for the internal modular api
#
# This macro adds an additional test to each module to perform KWStyle
#check on the code. Each module can provide the following file in the
#module root to override the default:
#  ITKKWStyleOverwrite.txt
#       - a KWSyle file to over write the default rules
#  ITKKWStyleFiles.txt.in
#       - a KWSyle file to be configured specifying files
#       - Lines should be of the form:
#           @ITK_MODULE_BINARY_DIR@/include/itk*.h
#         where ITK_MODULE in the name of the project specified by the
#         module.
#
# Globally the ITK.kws.xml file is used to configure the expected
#style.
option(
  ITK_USE_KWSTYLE
  "Enable the use of KWStyle for checking coding style."
  ${BUILD_TESTING}
)
mark_as_advanced(ITK_USE_KWSTYLE)
find_package(KWStyle 1.0.1 QUIET)

if(
  NOT
    KWSTYLE_FOUND
  AND
    BUILD_TESTING
  AND
    ITK_USE_KWSTYLE
  AND
    NOT
      CMAKE_CROSSCOMPILING
)
  include(${ITK_CMAKE_DIR}/../Utilities/KWStyle/BuildKWStyle.cmake)
elseif(NOT KWSTYLE_FOUND)
  set(ITK_USE_KWSTYLE OFF)
endif()

macro(itk_module_kwstyle_test _name)
  set(
    _kwstyle_itk_configuration_file
    "${ITK_CMAKE_DIR}/../Utilities/KWStyle/ITK.kws.xml"
  )

  if(EXISTS "${${itk-module}_SOURCE_DIR}/ITKKWStyleOverwrite.txt")
    set(
      _kwstyle_itk_overwrite_file
      "${${itk-module}_SOURCE_DIR}/ITKKWStyleOverwrite.txt"
    )
  else()
    set(
      _kwstyle_itk_overwrite_file
      "${ITK_CMAKE_DIR}/../Utilities/KWStyle/ITKOverwrite.txt"
    )
  endif()

  if(EXISTS "${${itk-module}_SOURCE_DIR}/ITKKWStyleFiles.txt.in")
    set(
      _kwstyle_itk_module_files_list_file
      "${${itk-module}_BINARY_DIR}/ITKKWStyleFiles.txt"
    )
    # KWStyle requires that the files list be absolute paths
    configure_file(
      ${${itk-module}_SOURCE_DIR}/ITKKWStyleFiles.txt.in
      ${_kwstyle_itk_module_files_list_file}
    )
  else()
    set(
      _kwstyle_itk_module_files_list_file
      "${${itk-module}_BINARY_DIR}/ITKKWStyleFiles.txt"
    )
    set(
      _kwstyle_file_list
      "${${itk-module}_SOURCE_DIR}/include/itk*.h"
      "${${itk-module}_SOURCE_DIR}/include/itk*.hxx"
      "${${itk-module}_SOURCE_DIR}/src/*.cxx"
      "${${itk-module}_SOURCE_DIR}/src/*.h"
      "${${itk-module}_SOURCE_DIR}/src/*.hxx"
      "${${itk-module}_SOURCE_DIR}/test/*.cxx"
    )
    file(WRITE ${_kwstyle_itk_module_files_list_file} "")
    foreach(item ${_kwstyle_file_list})
      file(APPEND ${_kwstyle_itk_module_files_list_file} "${item}\n")
    endforeach()
  endif()

  if(NOT KWSTYLE_EXECUTABLE)
    message(WARNING "KWSTYLE_EXECUTABLE is not set!")
  else()
    if(NOT DISABLE_MODULE_TESTS)
      itk_add_test(
        NAME ${itk-module}KWStyleTest
        COMMAND
          ${KWSTYLE_EXECUTABLE}
          -xml
          ${_kwstyle_itk_configuration_file}
          -v
          -o
          ${_kwstyle_itk_overwrite_file}
          -D
          ${_kwstyle_itk_module_files_list_file}
          -gcc
        WORKING_DIRECTORY ${ITK_CMAKE_DIR}/..
      )
    endif()
  endif()
endmacro()
